-/* exported addObjectSignalMethods */
+/* exported TransientSignalHolder, addObjectSignalMethods */
const { GObject } = imports.gi;
+/**
+ * @private
+ * @param {Object} obj - an object
+ * @returns {bool} - true if obj has a 'destroy' GObject signal
+ */
+function _hasDestroySignal(obj) {
+ return obj instanceof GObject.Object &&
+ GObject.signal_lookup('destroy', obj);
+}
+
+var TransientSignalHolder = GObject.registerClass(
+class TransientSignalHolder extends GObject.Object {
+ static [GObject.signals] = {
+ 'destroy': {},
+ };
+
+ constructor(owner) {
+ super();
+
+ if (_hasDestroySignal(owner))
+ owner.connectObject('destroy', () => this.destroy(), this);
+ }
+
+ destroy() {
+ this.emit('destroy');
+ }
+});
+
class SignalManager {
/**
* @returns {SignalManager} - the SignalManager singleton
* @param {Object=} owner - object that owns the tracker
*/
constructor(owner) {
- if (this._hasDestroySignal(owner))
+ if (_hasDestroySignal(owner))
this._ownerDestroyId = owner.connect_after('destroy', () => this.clear());
this._owner = owner;
this._map = new Map();
}
- /**
- * @private
- * @param {Object} obj - an object
- * @returns {bool} - true if obj has a 'destroy' GObject signal
- */
- _hasDestroySignal(obj) {
- return obj instanceof GObject.Object &&
- GObject.signal_lookup('destroy', obj);
- }
-
/**
* @typedef SignalData
* @property {number[]} ownerSignals - a list of handler IDs
* @returns {void}
*/
track(obj, ...handlerIds) {
- if (this._hasDestroySignal(obj))
+ if (_hasDestroySignal(obj))
this._trackDestroy(obj);
this._getSignalData(obj).ownerSignals.push(...handlerIds);
const Signals = imports.signals;
const Environment = imports.ui.environment;
+const { TransientSignalHolder } = imports.misc.signalTracker;
+
Environment.init();
const Destroyable = GObject.registerClass({
emitter2.emit('signal');
JsUnit.assertEquals(count, 10);
+
+emitter1.connectObject('signal', handler, tracked1);
+emitter2.connectObject('signal', handler, tracked1);
+
+transientHolder = new TransientSignalHolder(tracked1);
+
+emitter1.connectObject('signal', handler, transientHolder);
+emitter2.connectObject('signal', handler, transientHolder);
+
+emitter1.emit('signal');
+emitter2.emit('signal');
+
+JsUnit.assertEquals(count, 14);
+
+transientHolder.destroy();
+
+emitter1.emit('signal');
+emitter2.emit('signal');
+
+JsUnit.assertEquals(count, 16);
+
+transientHolder = new TransientSignalHolder(tracked1);
+
+emitter1.connectObject('signal', handler, transientHolder);
+emitter2.connectObject('signal', handler, transientHolder);
+
+emitter1.emit('signal');
+emitter2.emit('signal');
+
+JsUnit.assertEquals(count, 20);
+
+tracked1.emit('destroy');
+emitter1.emit('signal');
+emitter2.emit('signal');
+
+JsUnit.assertEquals(count, 20);